//============================================================================
/**
 *
 *	@file		drop_define.h
 *	@brief		ポケスリング 汎用定数
 *	@author		hosaka genya
 *	@data		2009.01.07
 *
 */
//============================================================================
#pragma once
#include "pkthev_drop.naix"
#include "drop_obj_main_NANR_LBLDEFS.h"
#include "drop_obj_sub_NANR_LBLDEFS.h"
#include "drop_obj_pri.h"

//=============================================================================
/**
 *								定数定義
 */
//=============================================================================

// 位置による拡縮
static const u8 RING_SCALE_DOT = 1;			///< このドット分移動するたびに
static const f32 RING_SCALE_VAL = 0.003f;	///< この値だけ小さくなる(1% = 0.01)
static const f32 RING_SCALE_MAX = 1.2f;		///< この大きさ以上にはならない
static const f32 TACKLE_PUSH_MUL = 3.0f;	///< タックル時のプッシュ係数
static const f32 TACKLE_POWER_MUL = 2.0f;	///< タックル時のパワー係数

enum
{
	// --- 競技 ---
	GAME_FPS = 30,
	GAME_TIME = GAME_FPS * 60,					///< プレイ時間(SYNC)
	SE_LAST_SYNC = GAME_FPS * 15,				///< 終了間際を知らせるSEの発音開始SYNC(終了から指定SYNC前)
	DROP_SCORE_MAX = 200,						///< スコア上限値

	// --- ポケモン ---
	POKE_TOUCH_PLAY = 1,						///< タッチ判定のアソビ(ドット)
	POKE_FALL_TIMER = GAME_FPS * 2,				///< 落下タイマー
	POKE_HOLD_S_FX = FX32_CONST(0.7F),			///< 通常時：毎フレーム踏ん張る力
	POKE_HOLD_L_FX = FX32_CONST(1.0F),			///< タックル・プレス衝突時：毎フレーム踏ん張る力
	POKE_PUSH_VEC_MAX_FX = FX32_CONST(12.0F),	///< ふっとび速度の上限

	HIT_STOP_SYNC = 4,							///< ヒットストップするSYNC
	HIT_SEND_SYNC = 4,							///< 親機が子機に送信し続けるSYNC

	RIVIVE_SYNC = GAME_FPS * 2,					///< 復活無敵時間

	// --- PANIC ---
	PANIC_SYNC = 30 * 2,						///< 混乱フレーム数
	PANIC_DIFF_Y = 24,							///< 混乱/汗アイコンとポケモンのY座標の差
	PANIC_RECVER_P_FX = FX32_CONST(20),			///< 混乱 復帰時のスタミナ

	// --- CHANGE ---
	BALL_MOVE_COUNT = 10,
	BALL_MOVE_SPEED = 40,
//	CHANGE_SYNC = 15,	///< 交代にかかるSYNC

	// --- SCORE ---
	SCORE_TACKLE = 1,
	SCORE_PRESS = 2,
	SCORE_FALL = 10,							///< 敵を落としたときに増える点数
	SCORE_DEC_SUICIDE = 10,						///< 自殺した時に減る点数

	// --- TACKLE ---
	TACKLE_CHECK_SYNC = 7,						///< このSYNC内にペンを放すとタックルする
	TACKLE_TP_OUT_FX = FX32_CONST(12),			///< ペンを離した時、ポケモンとの距離がこの値以上だとタックル
	TACKLE_PRE_SYNC = 4,						///< タックル予備動作
	TACKLE_MAIN_SYNC = 6,						///< タックルフレーム
	TACKLE_END_SYNC = 16,						///< タックル終了ウェイト
	TACKLE_PUSH_FX = FX32_CONST(4.0F),			///< タックル時の初期化速度
	TACKLE_ADD_VEC = FX32_CONST(0.7F),			///< タックル時に加速する力
	TACKLE_RANGE_ADD = 8,						///< タックル時に加算する当たり判定 半径

	// --- JUMP ---
	JUMP_CHECK_SYNC = 7,						///< このSYNC内にペンを放すとジャンプする
	JUMP_TP_IN_FX = FX32_CONST(4),				///< ペンを離した時、ポケモンとの距離がこの値以下だとジャンプ
	JUMP_LV_MAX =  5,
	JUMP_IN_SYNC = 5,							///< ジャンプ予備動作SYNC
	JUMP_SYNC = 10,								///< ジャンプSYNC
	JUMP_WAIT_SYNC = 10,						///< プレス予備動作（ジャンプ空中静止）SYNC
	PRESS_END_SYNC = 10,
	JUMP_DEF_ACCEL_FX = FX32_CONST(0.0F),
	JUMP_GRAVITY_FX = FX32_CONST(2.0F),

	// --- STAMINA ---
	STAMINA_HEAL_RING_FX = FX32_CONST(0),		///< 毎フレームこの値回復する。
	STAMINA_HEAL_BENCH_FX = FX32_CONST(0.2F),	///< 毎フレームこの値の回復する。
	STAMINA_SWEAT_POINT = 30,					///< スタミナがこの値以下になったら汗
	STAMINA_SLOW_POINT = 30,					///< スタミナがこの値以下になったら速度補正
	STAMINA_SLOW_MUL_FX = FX32_CONST(0.5),		///< 補正速度

	HOLD_MIN_FX = FX32_CONST(0.2),

	// AI
	AI_CALC_SPAN = 3,			///< このフレーム数に一度、AI処理を行う
	AI_TACKLE_RANGE_S_FX = FX32_CONST(32),
	AI_TACKLE_RANGE_L_FX = FX32_CONST(48),
	AI_TRACKLING_PAR_LOW1 = 60,	///< 追尾時、一番HPが低いポケモンを狙う確立
	AI_TRACKLING_PAR_LOW2 = 40,	///< 追尾時、二番目にHPが低いポケモンを狙う確立
	AI_JUMP_PAR_L = 5,

	// 移動パターンのパーセント
	AI_MOVE_PAR_TRACKING = 60,	///< 追尾する確率
	AI_MOVE_PAR_WAIT = 20,		///< 待機
	AI_MOVE_PAR_RAND = 20,		///< ランダム移動

	// 行動値
	AI_TIMER_TACKLE = 16,	///< タックル
	AI_TIMER_JUMP = 20,		///< ジャンプ
	AI_TIMER_TRACKING = 0,	///< 尾行
	AI_TIMER_WAIT = 10,
	AI_TIMER_RAND = 10,

	AI_CHANGE_RANGE_FX = FX32_CONST(64),	///< 交代判定時のポール半径
	AI_CHANGE_COUNTER = 0,//30,					///< 交代判定を行う頻度

	AI_NPC_PKGR_CNG_SYNC = 12,	///< NPCがポケグラ交換にかかるフレーム数

	// --- RING ---
	RING_Y_MIN = 64,
	RING_Y_MAX = 160,

	// --- ベンチポケモン座標 ---
	BENCH_POKE_X = 8 * 5,
	BENCH_POKE_Y = 8 * 6,
	BENCH_POKE_Y_OFS = 8 * 11,
	BENCH_POKEEFF_Y_DIFF = -8 * 3,						///< ポケモン座標と状態異常アイコンの差
	BENCH_POKE_OUT_Y = GX_LCD_SIZE_Y + 80,				///< ポケグラが捌ける時に目的にする座標
	BENCH_POKE_IN_Y = BENCH_POKE_Y + BENCH_POKE_Y_OFS,	///< ポケグラが出現する時に目的にする座標

	RANK_ON_TIME = GAME_TIME/GAME_FPS-5,	///< ランク表示ONにし始める時間
	RANK_OFF_TIME = 10,						///< ランク表示がOFFになる時間

	PUSH_NORMAL_FX = FX32_CONST(3),			///< タックル・プレス以外なら固定値吹っ飛ぶ
};

static const s16 g_JumpZ[JUMP_LV_MAX][JUMP_SYNC] =
{
	{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, },
	{  8, 14, 18, 20, 21, 22, 22, 23, 23, 24, },
	{ 10, 18, 24, 28, 29, 30, 30, 31, 31, 32, },
	{ 10, 19, 27, 33, 37 ,38, 38, 39, 39, 40, },
	{ 10, 19, 27, 34, 40, 44, 45, 46, 47, 48, },
};

static const u8 g_PressZ[JUMP_LV_MAX] = {
	0, 8 ,8, 8, 8,
};

static const u8 g_AI_JumpParS[ ENTRY_MEMBER_NUM_MAX-1 ] =
{
	5, 10, 30,
};

static const u8 g_AI_TacklePar[] =
{
	0, 10, 50, 80,
};

//--------------------------------------------------------------
///	System Const
//==============================================================
enum
{
	DROP_HEAP_SIZE = 0x60000,
	DISP_DISTANCE = 96,
	OBJ_DISTANCE = FX32_CONST(96*5),					///< システム上の画面差(回り込み阻止)
	ACT_POKE_MAX = ENTRY_MEMBER_NUM_MAX * ENTRY_MAX,	///< ポケモン数

	POKE_L_SIZE = 64,
	POKE_S_SIZE = 32,

	POKE_HIT_OFS = 13,
};

//--------------------------------------------------------------
///	ポケスリング用タッチ情報
//==============================================================
typedef struct TP_STATE_DROP_tag
{
	u32 ContCounter : 14;
	u32 Trg : 1;
	u32 Cont : 1;
	//[ADD]
	u32 ReleaseCount : 13;
	u32 bLockOn : 1;
	u32 DummyBit : 2;
} TP_STATE_DROP;

//--------------------------------------------------------------
///	二点座標
//==============================================================
typedef struct POS_DATA_tag
{
	s16 X;
	s16 Y;
} POS_DATA;

//--------------------------------------------------------------
///	円情報
//==============================================================
typedef struct {
	s16 px;
	s16 py;
	s16 circle;
} DROP_CIRCLE;


//--------------------------------------------------------------
///	初期配置テーブル
//==============================================================
static const POS_DATA g_PokeInitPos[ENTRY_MEMBER_NUM_MAX] = {
	{  9*8,		12*8 },	// 赤
	{  23*8,	12*8 },	// 青
	{  8*8,		17*8 },	// 緑
	{  24*8,	17*8 },	// 黄
};

//--------------------------------------------------------------
///	交代座標テーブル
//==============================================================
static const POS_DATA g_AI_ChangeTarget[ENTRY_MEMBER_NUM_MAX] = {
	{ 48,	64 }, // 赤
	{ 208,	64 }, // 青
	{ 32,	160 }, // 緑
	{ 224,	160 }, // 黄
};

//--------------------------------------------------------------
///	ポストの当たり判定（交代用）
//==============================================================
static const DROP_CIRCLE g_Post[ ENTRY_MEMBER_NUM_MAX ] = {
	{ 6*8, 6*8,		64, },
	{ 26*8, 6*8,	64, },
	{ 4*8, 18*8,	64, },
	{ 28*8, 18*8,	64, },
};

//--------------------------------------------------------------
///	CATS Resource Index
//==============================================================
enum {
	OBJ_POKEGRA_S_MAX = 2,
	OBJ_ID_MAX = 128,		///< 画面に同時に出現するOBJの上限
	CAP_ALL_NUM = 128,		///< CAPで管理するOBJの上限
	CMN_RES_NUM = 2,		///< 共通リソースの数
	CATS_RES_TBL_OFS = 10000,

	//-----------------------------------------------------------------------
	// ※CATS＋CLACTの所為でCAP内部のパレットカウンタが進んでいない為、
	// 参照パレットが0列目でないCAPはキメウチでずらす。
	//-----------------------------------------------------------------------
	CATS_CMN_M_PALOFS = 13,
	CATS_CMN_S_PALOFS = 0,

	CHR_ID_MAIN = CATS_RES_TBL_OFS,
	CHR_ID_SUB,
	CHR_ID_S_POKEGRA_1,
	CHR_ID_S_POKEGRA_2,
	CHR_ID_END,
	CHR_ID_MAX = CMN_RES_NUM + CHR_ID_END - CATS_RES_TBL_OFS,

	PAL_ID_MAIN = CATS_RES_TBL_OFS,
	PAL_ID_SUB,
	PAL_ID_S_POKEGRA_1,
	PAL_ID_S_POKEGRA_2,
	PAL_ID_S_POKEICON,
	PAL_ID_END,
	PAL_ID_MAX = CMN_RES_NUM + PAL_ID_END - CATS_RES_TBL_OFS,

	CEL_ID_MAIN = CATS_RES_TBL_OFS,
	CEL_ID_SUB,
	CEL_ID_POKEGRA,
	CEL_ID_END,
	CEL_ID_MAX = CMN_RES_NUM + CEL_ID_END - CATS_RES_TBL_OFS,

	ANM_ID_MAIN = CATS_RES_TBL_OFS,
	ANM_ID_SUB,
	ANM_ID_POKEGRA,
	ANM_ID_END,
	ANM_ID_MAX = CMN_RES_NUM + ANM_ID_END - CATS_RES_TBL_OFS,
};


//--------------------------------------------------------------
///	BG用定数
//==============================================================
enum {
	BG_FRM_M_WIN = GF_BGL_FRAME0_M,
	BG_FRM_M_FRONT = GF_BGL_FRAME1_M,
	BG_FRM_M_BACK = GF_BGL_FRAME2_M,
	BG_FRM_M_RSLT = GF_BGL_FRAME3_M,

	BG_FRM_S_BASE = GF_BGL_FRAME0_S,
	BG_FRM_S_TEXT = GF_BGL_FRAME1_S,
	BG_FRM_S_SCORE = GF_BGL_FRAME2_S,

	BG_FRM_M_RSLT_MASK = GX_PLANEMASK_BG3,
	MAIN_FONT_PAL = 15,
	SUB_FONT_PAL = 15,
};

#define BG_USE_NUM (7)
static const c_BG_UseList[ BG_USE_NUM ] =
{
	// LCD MAIN
	BG_FRM_M_WIN,	///< テキスト表示
	BG_FRM_M_FRONT,	///< リング手前
	BG_FRM_M_BACK,	///< リング背景
	BG_FRM_M_RSLT,	///< リザルト
	// LCD SUB
	BG_FRM_S_BASE,	///< 背景
	BG_FRM_S_TEXT,	///< テキスト
	BG_FRM_S_SCORE,	///< スコア
};

//---------------------------------------------
// Font Color
//---------------------------------------------
#define	COL_N_WHITE	( GF_PRINTCOLOR_MAKE( 15, 14, 0 ) )		// フォントカラー：白

//--------------------------------------------------------------
/// 順位データ
//==============================================================
typedef struct {
	u8 Score;
	u8 NetID;
} RANK_DATA;

//--------------------------------------------------------------
///	ポケモン状態
//==============================================================
typedef enum {
	POKE_ST_NONE = 0,	///< なし 0
	POKE_ST_ALIVE,		///< 通常 1
	POKE_ST_HIT_WAIT,	///< 抵抗無抵抗時間 2
	POKE_ST_FALL,		///< 落下 3
	POKE_ST_REVIVE,		///< 復活中 4
	POKE_ST_TACKLE_IN,	///< タックル予備動作 5
	POKE_ST_TACKLE,		///< タックル中 6
	POKE_ST_TACKLE_END,	///< タックル後処理 7
	POKE_ST_JUMP_IN,	///< ジャンプ予備動作 8
	POKE_ST_JUMP,		///< ジャンプ中 9
	POKE_ST_JUMP_WAIT,	///< ジャンプ待機 10
	POKE_ST_PRESS,		///< プレス処理 11
	POKE_ST_PRESS_END,	///< プレス終了処理 12
	// 余り 3 bit
} POKE_STATE;
